"""
3.7 遍历列表
本小节学习通过遍历列表来访问列表中的所有元素。在软件项目中，经常需要通过遍历
列表来检查或操作列表中的每一个元素，甚至遍历的效率（快慢）直接影响着整个程序的空
间复杂度和时间复杂度。因此，学习列表的遍历是非常有必要的一项任务。
"""
"""
3.7.1 按元素遍历列表
本知识点学习通过 for 循环遍历列表。列表是一种可迭代对象，因此可以通过 for 循环
来进行遍历。语法格式如下：
for 变量名 in 可迭代对象（列表）：
执行语句（缩进代码块）
"""
name_list = ['张三', '李四', '王五', '赵六']
for name in name_list:
    print(f'获取的姓名为: {name}')

print("*" * 100)

"""
3.7.2 按索引遍历列表
本知识点学习通过元素索引来遍历列表。通过索引遍历列表有两种方法：
通过 for 循环进行索引遍历，语法格式如下：
length = len(列表变量名) #列表长度，也用作循环控制边界
for 变量 in range( length ):
执行语句（缩进代码块）
通过 while 循环进行索引遍历，语法格式如下：
length = len(列表变量名) #列表长度，也用作循环控制边界
index = 0 #循环控制变量
while index < length: #循环控制条件
执行语句（缩进代码块）
index = index + 自增量 #每次循环，控制变量自增
"""

name_list_len = len(name_list)
for index in range(name_list_len):
    print(f'索引值为: {index}, 获取的姓名为:{name_list[index]}')

print("*" * 100)
print("使用enumerate实现列表遍历")
for index, name in enumerate(name_list):
    print(f'索引值为: {index}, 获取的姓名为:{name}')

"""
举例内容:
"""
s = 90
score = '优秀' if s >= 90 else '良好'
print(score)
print("*" * 100)


"""
3.8 列表推导式
本小节学习列表推导式。列表推导式（List comprehension）或者称为列表解析式，是
Python 中非常强大和优雅的方法，它可以基于现有列表做一些操作，从而快速创建新列表。
3.8.1 循环模式
本知识点学习循环模式下列表推导式的应用方法。循环模式的列表推导式语法为：
新列表变量名 = [表达式 for 变量 in 序列或迭代对象]
"""
"""
【示例 3.8.1.2】通过列表推导式生成 10 以内的所有偶数序列。
"""
oddNumList = [num*2 for num in range(1, 6)]
print(f'10 以内的偶数字符串为：{oddNumList}')

print("*" * 100)

"""
【示例 3.8.1.3】通过列表推导式将学生生日字符串解析为详细的年月日(YYYY-MM-DD)。
"""
student_birthday_list = ['20000228', '20000619', '20031201']
print(f'转换前的生日列表为: {student_birthday_list}')
birth_list = [f'{item[0:4]}-{item[4:6]}-{item[6:8]}' for item in student_birthday_list]
print(f'经过转换的生日列表为: {birth_list}')

print("*" * 100)


"""
【示例 3.8.1.4】通过列表推导式将学生成绩转换为考核等级。
"""
score_list = [54, 71, 80]
print(f'在未处理前，成绩为：{score_list}')
grade_list = ['合格' if score >= 60 else '不合格' for score in score_list]
print(f'在经过处理后，等级为: {grade_list}')
print("*" * 100)

"""
3.8.2 筛选模式
本知识点学习筛选模式下列表推导式的应用方法。筛选模式的列表推导式语法为：
新列表变量名 = [表达式 for 变量 in 序列或迭代对象 if 条件]
需要注意的是：列表推导式使用 for 循环将序列或迭代对象中的元素依次取出，赋值给
变量，再筛选 if 条件判断为真（True）的变量参与表达式运算，将所有的运算结果组合成新
列表。
"""

"""
【示例 3.8.2.2】通过列表推导式找出班级姓名列表中所有姓王的同学。
"""
student_name_list =  ['贺峰', '王勃', '虞菊花', '王瑶', '龙霄汉', '王国伟']
wang_name_list = [name for name in student_name_list if name.startswith('王')]
print(f'姓名为王的同学列表为: {wang_name_list}')

print("*" * 100)


"""
练习：以筛选模式，找出成绩为合格的内容
"""
score_list = [54, 71, 80]
new_score_list = [score for score in score_list if score >= 60]
print(f'成绩合格的列表为: {new_score_list}')
print("*" * 100)


"""
3.9 列表常用方法
本小节学习列表的其它常用方法的应用，这些方法不仅丰富了列表的功能，而且大大提
高了编程效率，因此在项目中较常使用。
3.9.1 列表元素计数
列表的内置方法count()提供了简单的元素计数功能，该方法可以根据程序提供的元素，
返回该元素在列表内出现的次数。语法形式为：
元素出现次数 = 列表变量名.count(元素)
"""

c_list = ['a', 'b', 'b', 'c', 'b']
b_count = c_list.count('b')
a_count = c_list.count('a')
print(f'b的数量为: {b_count}')
print(f'a的数量为: {a_count}')

print("*" * 100)

"""
3.9.2 列表元素逆置
所谓逆置是指将列表的所有元素由从头到尾排列改为从尾到头重新排列。列表的逆置可
以通过内置方法 reverse()实现，语法形式为：
列表变量名.reverse()
"""
r_list = [1,2,3,4,5,6,7,8]
r_list.reverse()
print(r_list)
name_list = ['张三','李四','王五','赵六']
name_list.reverse()
print(name_list)

print("*" * 100)


"""
3.9.3 列表的最大值与最小值
运用 Python 语言内置函数 max()和 min()，可以快速求得列表内所有元素的最大值和最
小值，语法形式为：
最大值 = max(列表变量名)
最小值 = min(列表变量名)
需要注意的是：max()函数和 min()按照大小比较数值，按照 ASCII 码比较字符。
"""
score_list = [54, 71, 80]
max_score = max(score_list)
min_score = min(score_list)
print(f'最大值: {max_score}, 最小值: {min_score}')